home *** CD-ROM | disk | FTP | other *** search
- <?php
- // +----------------------------------------------------------------------+
- // | PHP Version 4 |
- // +----------------------------------------------------------------------+
- // | Copyright (c) 1998-2004 Manuel Lemos, Tomas V.V.Cox, |
- // | Stig. S. Bakken, Lukas Smith |
- // | All rights reserved. |
- // +----------------------------------------------------------------------+
- // | MDB is a merge of PEAR DB and Metabases that provides a unified DB |
- // | API as well as database abstraction for PHP applications. |
- // | This LICENSE is in the BSD license style. |
- // | |
- // | Redistribution and use in source and binary forms, with or without |
- // | modification, are permitted provided that the following conditions |
- // | are met: |
- // | |
- // | Redistributions of source code must retain the above copyright |
- // | notice, this list of conditions and the following disclaimer. |
- // | |
- // | Redistributions in binary form must reproduce the above copyright |
- // | notice, this list of conditions and the following disclaimer in the |
- // | documentation and/or other materials provided with the distribution. |
- // | |
- // | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken, |
- // | Lukas Smith nor the names of his contributors may be used to endorse |
- // | or promote products derived from this software without specific prior|
- // | written permission. |
- // | |
- // | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
- // | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
- // | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
- // | FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
- // | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
- // | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
- // | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
- // | OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
- // | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
- // | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
- // | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
- // | POSSIBILITY OF SUCH DAMAGE. |
- // +----------------------------------------------------------------------+
- // | Author: Lukas Smith <smith@backendmedia.com> |
- // +----------------------------------------------------------------------+
- //
- // $Id: LOB.php,v 1.30.4.1 2004/01/08 13:43:03 lsmith Exp $
- //
-
- if(!defined('MDB_LOB_INCLUDED'))
- {
- define('MDB_LOB_INCLUDED', 1);
-
- /**
- * MDB Large Object (BLOB/CLOB) classes
- *
- * @package MDB
- * @category Database
- * @access private
- * @author Lukas Smith <smith@backendmedia.com>
- */
- class MDB_LOB
- {
- var $database;
- var $lob;
- var $data = '';
- var $position = 0;
-
- function create(&$arguments)
- {
- if(isset($arguments['Data'])) {
- $this->data = $arguments['Data'];
- }
- return(MDB_OK);
- }
-
- function destroy()
- {
- $this->data = '';
- }
-
- function endOfLob()
- {
- return($this->position >= strlen($this->data));
- }
-
- function readLob(&$data, $length)
- {
- $length = min($length, strlen($this->data) - $this->position);
- $data = substr($this->data, $this->position, $length);
- $this->position += $length;
- return($length);
- }
- };
-
- class MDB_LOB_Result extends MDB_LOB
- {
- var $result_lob = 0;
-
- function create(&$arguments)
- {
- if(!isset($arguments['ResultLOB'])) {
- return(PEAR::raiseError(NULL, MDB_ERROR_NEED_MORE_DATA, NULL, NULL,
- 'it was not specified a result Lob identifier',
- 'MDB_Error', TRUE));
- }
- $this->result_lob = $arguments['ResultLOB'];
- return(MDB_OK);
- }
-
- function destroy()
- {
- $this->database->_destroyResultLob($this->result_lob);
- }
-
- function endOfLob()
- {
- return($this->database->endOfResultLob($this->result_lob));
- }
-
- function readLob(&$data, $length)
- {
- $read_length = $this->database->_readResultLob($this->result_lob, $data, $length);
- if (MDB::isError($read_length)) {
- return($read_length);
- }
- if($read_length < 0) {
- return(PEAR::raiseError(NULL, MDB_ERROR_INVALID, NULL, NULL,
- 'data was read beyond end of data source',
- 'MDB_Error', TRUE));
- }
- return($read_length);
- }
- };
-
- class MDB_LOB_Input_File extends MDB_LOB
- {
- var $file = 0;
- var $opened_file = 0;
-
- function create(&$arguments)
- {
- if(isset($arguments['File'])) {
- if(intval($arguments['File']) == 0) {
- return(PEAR::raiseError(NULL, MDB_ERROR_INVALID, NULL, NULL,
- 'it was specified an invalid input file identifier',
- 'MDB_Error', TRUE));
- }
- $this->file = $arguments['File'];
- }
- else
- {
- if(isset($arguments['FileName'])) {
- if((!$this->file = fopen($arguments['FileName'], 'rb'))) {
- return(PEAR::raiseError(NULL, MDB_ERROR_NOT_FOUND, NULL, NULL,
- 'could not open specified input file ("'.$arguments['FileName'].'")',
- 'MDB_Error', TRUE));
- }
- $this->opened_file = 1;
- } else {
- return(PEAR::raiseError(NULL, MDB_ERROR_NEED_MORE_DATA, NULL, NULL,
- 'it was not specified the input file',
- 'MDB_Error', TRUE));
- }
- }
- return(MDB_OK);
- }
-
- function destroy()
- {
- if($this->opened_file) {
- fclose($this->file);
- $this->file = 0;
- $this->opened_file = 0;
- }
- }
-
- function endOfLob() {
- return(feof($this->file));
- }
-
- function readLob(&$data, $length)
- {
- if(gettype($data = @fread($this->file, $length))!= 'string') {
- return(PEAR::raiseError(NULL, MDB_ERROR, NULL, NULL,
- 'could not read from the input file',
- 'MDB_Error', TRUE));
- }
- return(strlen($data));
- }
- };
-
- class MDB_LOB_Output_File extends MDB_LOB
- {
- var $file = 0;
- var $opened_file = 0;
- var $input_lob = 0;
- var $opened_lob = 0;
- var $buffer_length = 8000;
-
- function create(&$arguments)
- {
- if(isset($arguments['BufferLength'])) {
- if($arguments['BufferLength'] <= 0) {
- return(PEAR::raiseError(NULL, MDB_ERROR_INVALID, NULL, NULL,
- 'it was specified an invalid buffer length',
- 'MDB_Error', TRUE));
- }
- $this->buffer_length = $arguments['BufferLength'];
- }
- if(isset($arguments['File'])) {
- if(intval($arguments['File']) == 0) {
- return(PEAR::raiseError(NULL, MDB_ERROR_INVALID, NULL, NULL,
- 'it was specified an invalid output file identifier',
- 'MDB_Error', TRUE));
- }
- $this->file = $arguments['File'];
- } else {
- if(isset($arguments['FileName'])) {
- if((!$this->file = fopen($arguments['FileName'],'wb'))) {
- return(PEAR::raiseError(NULL, MDB_ERROR_NOT_FOUND, NULL, NULL,
- 'could not open specified output file ("'.$arguments['FileName'].'")',
- 'MDB_Error', TRUE));
- }
- $this->opened_file = 1;
- } else {
- return(PEAR::raiseError(NULL, MDB_ERROR_NEED_MORE_DATA, NULL, NULL,
- 'it was not specified the output file',
- 'MDB_Error', TRUE));
- }
- }
- if(isset($arguments['LOB'])) {
- if(!is_object($arguments['LOB'])) {
- $this->destroy();
- return(PEAR::raiseError(NULL, MDB_ERROR_INVALID, NULL, NULL,
- 'it was specified an invalid input large object identifier',
- 'MDB_Error', TRUE));
- }
- $this->input_lob = $arguments['LOB'];
- } else {
- if($this->database
- && isset($arguments['Result'])
- && isset($arguments['Row'])
- && isset($arguments['Field'])
- && isset($arguments['Binary']))
- {
- if($arguments['Binary']) {
- $this->input_lob = $this->database->fetchBlob($arguments['Result'],
- $arguments['Row'], $arguments['Field']);
- } else {
- $this->input_lob = $this->database->fetchClob($arguments['Result'],
- $arguments['Row'], $arguments['Field']);
- }
- if($this->input_lob == 0) {
- $this->destroy();
- return(PEAR::raiseError(NULL, MDB_ERROR, NULL, NULL,
- 'could not fetch the input result large object',
- 'MDB_Error', TRUE));
- }
- $this->opened_lob = 1;
- } else {
- $this->destroy();
- return(PEAR::raiseError(NULL, MDB_ERROR_NEED_MORE_DATA, NULL, NULL,
- 'it was not specified the input large object identifier',
- 'MDB_Error', TRUE));
- }
- }
- return(MDB_OK);
- }
-
- function destroy()
- {
- if($this->opened_file) {
- fclose($this->file);
- $this->opened_file = 0;
- $this->file = 0;
- }
- if($this->opened_lob) {
- $this->database->destroyLob($this->input_lob);
- $this->input_lob = 0;
- $this->opened_lob = 0;
- }
- }
-
- function endOfLob()
- {
- return($this->database->endOfLob($this->input_lob));
- }
-
- function readLob(&$data, $length) {
- $buffer_length = ($length == 0 ? $this->buffer_length : $length);
- $written_full = 0;
- do {
- for($written = 0;
- !$this->database->endOfLob($this->input_lob)
- && $written < $buffer_length;
- $written += $read)
- {
- if(MDB::isError($result = $this->database->
- readLob($this->input_lob, $buffer, $buffer_length)))
- {
- return($result);
- }
- $read = strlen($buffer);
- if(@fwrite($this->file, $buffer, $read)!= $read) {
- return(PEAR::raiseError(NULL, MDB_ERROR, NULL, NULL,
- 'could not write to the output file',
- 'MDB_Error', TRUE));
- }
- }
- $written_full += $written;
- } while($length == 0 && !$this->database->endOfLob($this->input_lob));
- return($written_full);
- }
- }
-
- };
- ?>
-